package de.g18.gruppe3.dataio.service;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import de.g18.gruppe3.common.exception.SQLServiceException;
import de.g18.gruppe3.common.io.SQLImportService;
import de.g18.gruppe3.common.model.OrganizationalUnit;
import de.g18.gruppe3.common.model.User;

/**
 * Mysql-Schnittstelle zum auslesen von Datensätzen.
 *
 * @author <a href="mailto:skopatz@gmx.net">Sebastian Kopatz</a>
 */

public class SQLImportServiceImpl implements SQLImportService{

	private List<User> listUser;
	private Connection con = null;
	private ResultSet rs = null;
	private List<User> returnComparedUser;

	/**
	 * Konstruktor - Initialisierung der listen
	 */
	public SQLImportServiceImpl(){
		this.listUser = new ArrayList<User>();
		this.returnComparedUser = new ArrayList<User>();
	}

	/**
	 * gibt eine mit dem von LDAP aktuelles Stand verglichene Liste zurück
	 */
	public List<User> getReturnComparedUser(){
		return this.returnComparedUser;
	}

	/**
	 * setz den Stand der Liste ComparedUser auf den der Übergebenen Liste
	 */
	public List<User> setReturnComparedUser(List<User> comparedUser){
		return this.returnComparedUser = comparedUser;
	}

	/**
	 * Holt sich die Verbindung
	 */
	public Connection getCurrentConnection(){
		return this.con;
	}
	
	/**
	 * Holt sich sich das ResultSet einer SQL-Abfrage
	 */
	public ResultSet getCurrentresult(){
		return this.rs;
	}

	/**
	 * Setzt das ResultSet auf das übergeben ResultSet
	 */
	public ResultSet setCurrentresult(ResultSet rs){
		this.rs = rs;
		return this.rs;
	}
	
	/**
	 * Konfiguriert die Verbindung zur Mysql-Datenbank
	 */
	private Connection setCurrentConnection(String url, String user, String password) throws SQLException{
		try{
			Class.forName("com.mysql.jdbc.Driver").newInstance();
		}catch (Exception ex){
			throw new IllegalStateException("Mysql-Treiber konnte nicht geladen werden", ex);
		}
		con = DriverManager.getConnection("jdbc:mysql://"+url, user, password);
		return con;
	}
	
	/**
	 * Liest die Daten aus der Mysql-Datenbank aus und gibt ein ResultSet mit den Ergebnissen zurück
	 * @throws SQLServiceException 
	 */
	public ResultSet readData(String url, String user, String password) throws SQLServiceException {
		try {
			rs = null;
			setCurrentConnection(url, user, password);
			con = getCurrentConnection();
			Statement stmt;
			stmt = con.createStatement();
			stmt.executeUpdate("USE junkDB");
			setCurrentresult(stmt.executeQuery("SELECT * FROM person"));
			return rs;
		} catch (SQLException e) {
			throw new SQLServiceException("Benutzer konnten nicht aus Datenbank geladen werden!", e);
		} finally {
			try {
				if (con != null) {
					con.close();
				}
			} catch (SQLException e) {
				throw new SQLServiceException("SQLContext konnte nicht geschloßen werden!", e);
			}
		}
	}

	/**
	 * Mapped die Einträge eines ResultSets auf ein User-Objekt um
	 */
	public List<User> resultSetToUser(ResultSet rs) throws SQLServiceException{
		listUser.clear();
		try {
			while (rs.next()) {
				User user = new User(rs.getString("user"), rs.getString("vorname"), rs.getString("name"));
				user.setPasswort(rs.getString("passwort"));
				user.setOU(new OrganizationalUnit(rs.getString("klasse")));
				listUser.add(user);
			}
		} catch (SQLException e) {
			throw new SQLServiceException("Benutzer konnten nicht gemappt werden!", e);
		}
		return listUser;
	}

	/**
	 * Initialisiert das auslesen der MYsql-Datenbank und das abgleichen mit dem bestehendem LDAP-Verzeichniss
	 * Datenhoheit hat hier die Datenbank-Liste
	 * @throws SQLServiceException 
	 */
	@Override
	public List<User> importUserSQL(String url, String user, String password) throws SQLServiceException {
		return resultSetToUser(readData(url, user, password));
	}

}
